#!/usr/bin/env bash
set -xeo pipefail

SELF=$(command -v "$0")
APP="$1"
TARGET="$2"
FORWARDED_PORT="$3"
SHOULD_FAIL="$4"
BRANCH="${5:-master}"
REMOTE="dokku@$TARGET"
REPO="test-$(basename "$APP")-$RANDOM"

ssh "$REMOTE" events:on

destroy_app() {
  ssh "$REMOTE" apps:destroy "$REPO" --force
  ssh "$REMOTE" events:off
}

failed() {
  echo "************ $1 failed ************"
  destroy_app
  exit 1
}

succeeded() {
  echo "************ $1 succeeded but should have failed ************"
  destroy_app
  exit 1
}

TMP=$(mktemp -d "/tmp/$TARGET.XXXXX")
rmdir "$TMP" && cp -r "$(dirname "$SELF")/$APP" "$TMP"

pushd "$TMP" &>/dev/null || exit 1
trap 'popd &>/dev/null || true; rm -rf "$TMP"' INT TERM EXIT

git init
git config user.email "robot@example.com"
git config user.name "Test Robot"
git remote add target "${REMOTE}:${REPO}"

[[ -f gitignore ]] && mv gitignore .gitignore
git add .

[[ -x pre-commit ]] && ./pre-commit "$REMOTE" "$REPO"
git commit -m 'initial commit'
current_branch="$(git rev-parse --abbrev-ref HEAD)"
if [[ "$SHOULD_FAIL" == true ]]; then
  git push target "$current_branch:$BRANCH" && succeeded git-push
else
  git push target "$current_branch:$BRANCH" || failed git-push
fi
if [[ -x post-deploy ]]; then
  ./post-deploy "$REMOTE" "$REPO" || failed post-deploy
fi

if [[ "$SHOULD_FAIL" == true ]]; then
  echo "-----> Deploy failed (as it should have)!"
  destroy_app
  exit 0
fi

ssh "$REMOTE" events
ssh "$REMOTE" apps:list
URL=$(ssh "$REMOTE" url "$REPO")$FORWARDED_PORT
sleep 2
if (./check_deploy "$URL"); then
  echo "-----> Deploy success!"
else
  sleep 4
  if (./check_deploy "$URL"); then
    echo "-----> Deploy success!"
  else
    failed check-deploy
  fi
fi

destroy_app
